
/***************************************************************************************************
  Copyright(C)   2011-8-24
  All rights reserved.
  File Name: playlist.h

  Description:播放列表解析模块
              将串口TIS发来的数据得到 当前线路和站点以及信号 在数据库中得到当前的 播放列表，将播放列表按以下的规律
              进行播放
              列表格式如下:

    包                   ---- 布局                     ---- 分区             ---- 播放列表

    QList<RoutePkgList>  ---- QList<RoutePkgStruct>   ---- RoutePkgStruct   ---- QList<ContentStruct>

    1个包内包含多个布局，1个布局包含多个分区，1个分区内包含多条播放列表
    包：  一般有2个包，一个自定义包和一个默认播放包，如果没有自定义包或者自定义包播放完成，那么播放默认包的
    布局: 一个包内可能有几个布局，按顺序播放，每个布局可以设置当前布局的播放时间，如果超出时间，那么进行下一个布局的播放
    分区: 一个布局有好几个分区， 这些分区同时播放
    播放列表:   播放在数据库中取出包时已经编排好顺序，只需要顺序播放即可，当全部内容播放完成后，如果有无限制播放的内容
               那么继续按序播放此无限制内容，如果没有，那么接放默认包的内容


  ***************************************************************************************************/

#ifndef PLAYLIST_H
#define PLAYLIST_H

#include <QObject>

#include "routedb.h"
#include "../pictureviewer/pixplaylabel.h"
#include "../playlist/medialist.h"
#include "../playlist/bulletinlist.h"
#include "moduleplay.h"
#include "log.h"


//typedef QList<PixPlayLabel*>

class PlayList : public QObject
{
    Q_OBJECT
    LOG4QT_DECLARE_QCLASS_LOGGER

public:
    explicit PlayList(QObject *parent = 0);
    ~PlayList();

    typedef RoutePkgList ListItem;

    typedef QList<PixPlayLabel*>  PicList;
    typedef QList<medialist*>     MediaList;
    typedef QList<bulletinlist*>  BulletinList;

    typedef QList<ModulePlay*> modulePlayList;

    bool Load(const QString& strListPath, const QString& resource);

    void unLoad();


    void seekToTimePos(const float seconds, const int partitioinId);
    void getCurTimePos(const int partitioinId);

    void updateTranInfo(const RouteMsgStruct& routeMsgStruct);

    //浏览更新状态
    void updateCeTranInfo(const CeRouteMsg& routeMsg);


    //更新状态,state为0时开始更新,state=1时为更新完成
    void updateDataState(const int state, const QString& msg);

    //播放开机信息
    void playInfomation(const int second, const QString& msg);

    void chcekLcd(const qint8 cmd);

private:
    void clearList();
    void parseList(const ListItem& list);
    void getDefaultList(ListItem& list, const RouteMsgStruct& routeMsg);

    void getCeDefaultList(ListItem& list, const CeRouteMsg& routeMsg);
//    QList<medialist *> mediaPlayList;
//    QList<PixPlayLabel *> pixPlayList;
//    QList<bulletinlist *> bulletinList;

signals:
    void updateConfig();
    void mplayerTimePos(const float seconds, const int partitionID);


public slots:
    void updateTimeOut();
    void partitionPlayFinish(const int partitionID);
    void timeToPlayNextList();

private:

    QList<RoutePkgList>  m_usrPkgList;                //总的播放内容表(自定义播表内容)
    QList<RoutePkgList>  m_defaultPkgList;            //总的播放内容表(默认播表内容)


    int             m_nDefautlCur;                   //自定义播表序号
    int             m_nUsrCur;                       //默认播表序号

    QList<int>      m_partitionIDList;               //分区列表,保存当前有几个分区，用来确定当前布局几时全部播放完成


    RouteDB         m_db;


    PicList         m_picList;
    MediaList       m_mediaList;
    BulletinList    m_bulletinList;

    modulePlayList  m_moduleList;
    bool            m_isUpdate;         //是否正在更新中
    bool            m_isCheckLcd;       //是否正在测试LCD屏,如果正在测试LCD屏，那么收到发过来播放列表不进行反应
    QTimer*         m_updateTimer;
    QTimer*         m_playTimer;        //播放定时器

//    bool            m_isPlayDefault;    //是否已经在播放默认列表了
    int             m_lastPlayList;

    QString         m_resourceName;     //资源文件名字

  //QList<M

  //  QObject *m_pMainWnd;
};

#endif // PLAYLIST_H
